package command;

import common.ParseException;
import common.Strings;
import file.File;
import file.FileString;
import file.FileType;
import file.Files;

public class Include extends Cmd {
    String aliasName;
    boolean before;

    protected Include(FileString parentFileString) throws ParseException {
        super(parentFileString);
        before = true;
        String[] strs = Strings.trinAndDeleteDoubleSpace(parentFileString.getCommand()).split(" ");
        if (strs.length < 2 || strs.length > 3)
            throw new ParseException(getParentFileString(), "@iclude комманда должна содержать от 2х до 3х элементов, разделенных пробелом");
        if (!strs[0].equalsIgnoreCase("@include"))
            throw new ParseException(getParentFileString(), "@iclude комманда не правильно распознана");
        aliasName = strs[1].replaceAll("\\W","_");
        File file = Files.getFile(aliasName);

        if (file == null)
            throw new ParseException(getParentFileString(), "@iclude комманда ссылается на несуществующий алиас ("+aliasName+")");
        if (strs.length > 2) {
            if (strs[2].equalsIgnoreCase("PARSE"))
                before = true;
            else if (strs[2].equalsIgnoreCase("STATIC"))
                before = false;
            else
                throw new ParseException(getParentFileString(), "3й параметр @iclude м.б. равен [PARSE|STATIC]");
        }
        if (file.getFileType() == FileType.BAD)
            throw new ParseException(getParentFileString(), "@iclude пытается вызвать BAD-файл");
        if(before && file.getFileType() != FileType.PARSE && file.getFileType() != FileType.INCLUDE)
            throw new ParseException(parentFileString,"PARSE @include может вставлять только файлы типа PARSE и INCLUDE");
        if(!before && file.getFileType() != FileType.STATIC_PARSE && file.getFileType() != FileType.STATIC_INCLUDE)
            throw new ParseException(parentFileString,"STATIC @include может вставлять только файлы типа STATIC_PARSE и STATIC_INCLUDE");
    }

    @Override
    public Cmd getCopy() throws ParseException {
        Include tCmd = new Include(getParentFileString().getCopy());
        for (Cmd ttCmd : getBody())
            tCmd.addCmdToBody(ttCmd.getCopy());
        return tCmd;
    }

    public String getAliasName() {
        return aliasName;
    }

    public boolean isBefore() {
        return before;
    }
}
